package QianFeng09.ThreadDemo;
/**
 * join与中断线程：
 * public final void join() throws InterruptedException
 *      等待这个线程死亡。加入线程，让调用此方法的线程先执行指定时间或执行完毕，在执行其他线程
 *      调用此方法的行为方式与调用完全相同
 * join (O)
 *      异常InterruptedException -如果任何线程中断当前线程。当抛出此异常时， 当前线程的中断状态将被清除。
 * public void interrupt()
 *      中断这个线程。
 *      除非当前线程中断自身，这是始终允许的
 * public static boolean interrupted()
 *      测试当前线程是否中断。该方法可以清除线程的中断状态。换句话说，如果这个方法被连续调用两次，那么第二
 *      个调用将返回false (除非当前线程再次中断，在第一个调用 已经清除其中断状态之后，在第二个调用之前已经检查过)
 *      忽略线程中断，因为线程在中断时不存在将被该方法返回false所反映。
 * 自义标记中断线程（推荐使用）
 **/
public class ThreadDemo2 {
    public static void main(String[] args) {
        //MyRunnable2 myRunnable1 = new MyRunnable2();
        MyRunnable3 myRunnable2 = new MyRunnable3();
        //Thread thread1 = new Thread(myRunnable1);
        Thread thread2 = new Thread(myRunnable2);
        //thread1.start();
        thread2.start();

        for (int i = 0; i < 50; i++) {
            System.out.println(Thread.currentThread().getName() + "--" + i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (i == 20) {
                /*try {
                    thread1.join();//让thread线程执行完毕
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }*/
                //thread1.interrupt();//中断线程，只是作了一个中断标记 sleep会清除中断状态
                myRunnable2.flag = false;//循环停止，线程中断
            }
        }
    }
}

class MyRunnable2 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            if (Thread.interrupted()) {//测试中断状态，此方法会把中断状态清除
                break;//退出线程
            }
            System.out.println(Thread.currentThread().getName() + "--" + i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();
            }
        }

    }
}

//自义标记中断线程
class MyRunnable3 implements Runnable {
    public boolean flag = true;
    public MyRunnable3() {
        flag = true;
    }
    @Override
    public void run() {
        int i = 0;
        while (flag) {
            System.out.println(Thread.currentThread().getName() + "==" + i);
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}